/**
 * https://leetcode-cn.com/problems/rotate-image/
 * 旋转图像
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 * @param matrix
 */
const rotate = (matrix: number[][]): void => {
  let len = matrix.length;

  // 翻转上下
  for (let i = 0; i < len >> 1; i++) {
    const tmp = matrix[i];
    matrix[i] = matrix[len - 1 - i];
    matrix[len - 1 - i] = tmp;
  }

  // 对角线翻转
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      const tmp = matrix[i][j];
      matrix[i][j] = matrix[j][i];
      matrix[j][i] = tmp;
    }
  }
};


const rotate2 = (matrix: number[][]): void => {
  const len = matrix.length;

  // 为空, 直接返回
  if (len <= 1) return;
  // 保存第一行的各个项
  // let tmp = matrix[0][i];
  // matrix[0][i] = matrix[len - 1 - i][0];
  // matrix[len - 1 - i][0] = matrix[len - 1][len - 1 - i];
  // matrix[len - 1][len - 1 - i] = matrix[i][len - 1];
  // m
  for (let k = 0; k < len >> 1; k++) {
    for (let i = 0; i < len - (len >> 1); i++) {
      // 保存第一行的各个项
      let tmp = matrix[k][i];
      matrix[k][i] = matrix[len - 1 - i][k];
      matrix[len - 1 - i][k] = matrix[len - 1 - k][len - 1 - i];
      matrix[len - 1 - k][len - 1 - i] = matrix[i][len - 1 - k];
      matrix[i][len - 1 - k] = tmp;
    }
  }
};

// [0, 0]
// [1, 1]

// const m = [[1,2,3],[4,5,6],[7,8,9]]
const m = [
  [5, 1, 9, 11],
  [2, 4, 8, 10],
  [13, 3, 6, 7],
  [15, 14, 12, 16],
];
rotate(m);
console.log(m);
